home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / fixes.arc / FDOPEN.C < prev    next >
C/C++ Source or Header  |  1985-11-20  |  1KB  |  68 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3.  
  4. extern    FILE    _iob[];
  5.  
  6. FILE *fdopen(h, mode)
  7.     register int h;
  8.     register char *mode;
  9.     {
  10.     register char *p = NULL;
  11.     register int i, iomode = 0, f = 0;
  12.     register FILE *fp = NULL;
  13.  
  14.     for(i=0; (!fp && (i < _NFILE)); ++i)
  15.         if(!(_iob[i]._flag & (_IOREAD | _IOWRT)))   /* empty slot? */
  16.             fp = &_iob[i];
  17.     if(!fp)
  18.         return(NULL);
  19.     while(*mode)
  20.         {
  21.         switch(*mode++)
  22.             {
  23.             case 'r':
  24.                 f |= _IOREAD;
  25.                 break;
  26.             case 'w':
  27.                 f |= _IOWRT;
  28.                 iomode |= (O_CREAT | O_TRUNC);
  29.                 break;
  30.             case 'a':
  31.                 f |= _IOWRT;
  32.                 iomode |= (O_CREAT | O_APPEND);
  33.                 break;
  34.             case '+':
  35.                 f |= (_IOREAD | _IOWRT);
  36.                 break;
  37.             case 'b':
  38.                 f |= _IOBIN;
  39.                 break;
  40.             case 't':
  41.                 f &= ~_IOBIN;
  42.                 break;
  43.             default:
  44.                 fputs("Illegal file mode.\n", stderr);
  45.                 return(NULL);
  46.             }
  47.         }
  48.     if((i = (f & (_IOREAD | _IOWRT))) == 0)
  49.         return(NULL);
  50.     else if(i == _IOREAD)
  51.         iomode |= O_RDONLY;
  52.     else if(i == _IOWRT)
  53.         iomode |= O_WRONLY;
  54.     else
  55.         iomode |= O_RDWR;
  56.     if(isatty(h))
  57.         f |= (_IODEV | _IONBF);
  58.     else
  59.         f |= _IOFBF;
  60.     fp->_file = h;            /* file handle */
  61.     fp->_flag = f;            /* file status flags */
  62.     fp->_base = NULL;        /* base of file buffer */
  63.     fp->_ptr = NULL;        /* current buffer pointer */
  64.     fp->_bsiz = 0;            /* buffer size */
  65.     fp->_cnt = 0;            /* # of bytes in buffer */
  66.     return(fp);
  67.     }
  68.